
    
.386                               ;允许汇编80386的非特权指令
.model flat, stdcall                   ;选择平面（flat）存储模式
option casemap :none                ;指明标识符对大小写敏感
include \masm32\include\windows.inc  ;函数的常量和声明
include \masm32\include\kernel32.inc  ;函数的常量和声明
include \masm32\include\masm32.inc  ;函数的常量和声明
includelib \masm32\lib\kernel32.lib    ;链接库
includelib \masm32\lib\masm32.lib    ;链接库
.data
    str_1 BYTE "Please input a decimal number(0~4294967295) : ",0
    str_2 BYTE "The hexdecimal number is : ",0
    array BYTE "0123456789abcdef"  ;十六进制数字符串所用字符表
    buf BYTE 20 DUP(0)       ;用于StdIn的输入
    temp DWORD 0          ;数据存储，防止丢失数据
    anw BYTE 8 DUP(30h)    ;存储答案的字符串

.code
start:
    invoke StdOut, addr str_1
    invoke StdIn, addr buf,20    ;输入字符串
    mov eax,0h
    mov ecx,0h
    mov edx,0h 

dec2dw:                      ;将十进制字符串转换成DWORD数据
    mov dl,byte PTR [buf+ecx]   ;从最高位取出输入的字符串
    CMP dl,0h                ;字符串是以0结尾，所以当取出0的时候跳出循环
JE ready                 ;当CMP判断相等时跳出dec2dw循环
    SUB dl,30h               ;把取出的数字字符与字符0的ASCLL码值相减，变成数字
    mov ebx,eax             ;为左移实现乘10坐准备
    SHL ebx,3               ;左移三位，将ebx存储值变成八倍
SHL eax,1               ;左移一位，将eax存储值变成两倍
    ADD eax,ebx            ;相加，使eax值变成原来值得十倍
ADD eax,edx            ;加上存储在ebx中的那一位
    INC ecx                ;ecx值加一，便于循环取出下一位
    JMP dec2dw            ;dec2dw循环跳转语句

ready:
    mov ecx,8h             ;控制循环次数
    mov edx,0h            ;控制存储的相应位数
    mov temp,eax          ;用temp记录数值

dw2hex1:                 ;将DWORD数据转换成十六进制数的 ASCII字符串
    mov eax,temp          ;将移位后的temp重新赋值给eax      
AND eax,0fh  ;将eax与0fh做位与运算，保留二进制下最后四位即十六进制最后一位
mov bl,BYTE ptr[array+eax]
          ;根据取出的位数从十六进制的字母表里取出相应的字符
    mov [anw+ecx-1h],bl     ;将取出字符放在存储答案的字符串的相应位上
    DEC ecx               
    INC edx           
    SHR temp,4            ;十六进制下的将倒数第二位变成最后一位，便于循环取出
    CMP ecx,0h            ;判断ecx，如果是0h则结束循环
    JE Print                ;跳转到打印结果
    JMP dw2hex1          ;dw2dec1循环跳转语句

Print:
    invoke StdOut, addr str_2
    invoke StdOut,addr anw   ;输出结果
    invoke ExitProcess,0
    
